﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DTO_MechSysWeb;
using BLL_MechSysWeb;
using System.Data;
using System.Web.Security;
using System.Drawing;

namespace WEB_MechSysWeb.Paginas_Logado
{
    public partial class ClienteAgendamento : System.Web.UI.Page
    {
        DTOAgendamento dtoAgendamento = new DTOAgendamento();
        BLLAgendamento bllAgendamento = new BLLAgendamento();
        DTOCliente dtoCliente = new DTOCliente();
        BLLCliente bllCliente = new BLLCliente();
        DTOVeiculo dtoVeiculo = new DTOVeiculo();
        BLLVeiculo bllVeiculo = new BLLVeiculo();
        MembershipUser memberShipUser;
        DateTime dataAtual;
        DataTable dataTableAgendamentos;
        static int veiculoID, agendamentoID;
        static string status;
        int clienteID;
        string userID;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Habilitar(false);
            }

            try
            {
                memberShipUser = Membership.GetUser(User.Identity.Name);
                if (memberShipUser != null)
                {
                    if (Roles.IsUserInRole("Cliente"))
                    {
                        userID = memberShipUser.ProviderUserKey.ToString();
                        clienteID = bllCliente.BuscarClienteIDPorUserID(userID);

                    }
                    if (Roles.IsUserInRole("Administrador"))
                    {

                        Response.Redirect("~/Paginas_Administrador/PaginaPrincipalAdm.aspx");
                    }
                }
                else
                {
                    Response.Redirect("~/Paginas_Publico/PagLogin.aspx");
                }
            }
            catch (Exception)
            {
                Response.Redirect("~/Paginas_Publico/PagLogin.aspx");
            }

            PreecherDados();
        }

        public DataTable PopulaGrid()
        {
            DataTable dataTableGridView = new DataTable();
            DataRow dataRow;

            dataTableAgendamentos = bllAgendamento.BuscarAgendamentoPorClienteID(clienteID);
            try
            {
                if (dataTableAgendamentos.Rows.Count > 0)
                {
                    dataTableGridView.Columns.Add("AgendamentoID", typeof(string));
                    dataTableGridView.Columns.Add("Veiculo", typeof(string));
                    dataTableGridView.Columns.Add("Placa", typeof(string));
                    dataTableGridView.Columns.Add("Status", typeof(string));
                    dataTableGridView.Columns.Add("DataAgendada", typeof(string));
                    dataTableGridView.Columns.Add("Turno", typeof(string));

                    for (int i = 0; i < dataTableAgendamentos.Rows.Count; i++)
                    {
                        dataRow = dataTableGridView.NewRow();

                        dataRow["AgendamentoID"] = dataTableAgendamentos.Rows[i]["AgendamentoID"];
                        dataRow["Veiculo"] = string.Format("{0} {1}", dataTableAgendamentos.Rows[i]["Marca"], dataTableAgendamentos.Rows[i]["Modelo"]);
                        //string placa = dataTableAgendamentos.Rows[i]["Placa"].ToString();
                        //dataRow["Placa"] = string.Format("{0}-{1}", placa.Substring(0, 3).ToUpper(), placa.Substring(3, 4));
                        dataRow["Placa"] = dataTableAgendamentos.Rows[i]["Placa"];
                        dataRow["Status"] = VerificaStatus((BLLEnumStatus)(int)dataTableAgendamentos.Rows[i]["StatusAtual"]);
                        dataRow["DataAgendada"] = string.Format("{0:d}", dataTableAgendamentos.Rows[i]["DataAgendada"]);
                        bool turno = (bool)dataTableAgendamentos.Rows[i]["Turno"];
                        if (turno)
                        {
                            dataRow["Turno"] = "Tarde";
                        }
                        else
                        {
                            dataRow["Turno"] = "Manhã";
                        }

                        // Adiciona linha ao DataTable.
                        dataTableGridView.Rows.Add(dataRow);

                    }
                }

            }
            catch (Exception)
            {
                Mensagem.ExibirEmUP("Não foi possível carregar os dados para o grid!");
            }

            return dataTableGridView;
        }

        public string VerificaStatus(BLLEnumStatus enume)
        {
            //Status 1-Agendado 2-Concluído 3-Cancelado 4-Não compareceu              
            string stringStatus = "Agendado";

            switch (enume)
            {
                case BLLEnumStatus.Concluído:
                    stringStatus = "Concluído";
                    break;
                case BLLEnumStatus.Cancelado:
                    stringStatus = "Cancelado";
                    break;
                case BLLEnumStatus.NãoCompareceu:
                    stringStatus = "Não Compareceu";
                    break;
                default:
                    break;
            }

            return stringStatus;
        }

        public void PreecherDados()
        {
            try
            {
                memberShipUser = Membership.GetUser();
                userID = memberShipUser.ProviderUserKey.ToString();
                clienteID = bllCliente.BuscarClienteIDPorUserID(userID);

                gridAgendamentos.DataSource = PopulaGrid();
                gridAgendamentos.DataBind();

                gridSelecioneVeiculo.DataSource = bllVeiculo.BuscarVeiculosPorClienteID(clienteID);
                gridSelecioneVeiculo.DataBind();
            }
            catch (Exception)
            {
                Mensagem.ExibirEmUP("Não foi possível carregar dados!");
            }
        }

        protected void imgbtnPesquisar_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                if (!string.IsNullOrEmpty(txtDataFiltro.Text))
                {
                    DateTime data = Convert.ToDateTime(txtDataFiltro.Text);
                    gridAgendamentos.DataSource = bllAgendamento.BuscarAgendamentoPorData(data);
                    gridAgendamentos.DataBind();
                }
                else
                {
                    Mensagem.Exibir("Informe uma data para pesquisar!");
                }
            }
            catch
            {
                Mensagem.Exibir("Não foi possível encontrar dados!");
            }
        }

        public void Habilitar(bool status)
        {
            calendarAgenda.Enabled = status;
            rdListTurno.Enabled = status;
            txtResumo.Enabled = status;
            txtDescricao.Enabled = status;
            btnNovo.Enabled = !status;
            btnEditar.Enabled = !status;
            btnCancelar.Enabled = status;
            btnSalvar.Enabled = status;
            btnExcluir.Enabled = status;
            btnSelecionaveiculo.Enabled = status;

            if (status == true)
            {
                btnNovo.ForeColor = System.Drawing.Color.Black;
                btnEditar.ForeColor = System.Drawing.Color.Black;
                btnCancelar.ForeColor = System.Drawing.Color.White;
                btnSalvar.ForeColor = System.Drawing.Color.White;
                btnExcluir.ForeColor = System.Drawing.Color.White;
                btnSelecionaveiculo.ForeColor = System.Drawing.Color.White;
            }
            if (status == false)
            {
                btnNovo.ForeColor = System.Drawing.Color.White;
                btnEditar.ForeColor = System.Drawing.Color.White;
                btnCancelar.ForeColor = System.Drawing.Color.Black;
                btnSalvar.ForeColor = System.Drawing.Color.Black;
                btnExcluir.ForeColor = System.Drawing.Color.Black;
                btnSelecionaveiculo.ForeColor = System.Drawing.Color.Black;
            }
        }

        public void LimparCampos()
        {
            calendarAgenda.SelectedDate = DateTime.Now;
            rdListTurno.SelectedValue = "M";
            txtVeiculo.Text = string.Empty;
            txtResumo.Text = string.Empty;
            txtDescricao.Text = string.Empty;
            agendamentoID = 0;
            clienteID = 0;
            veiculoID = 0;
            status = "";
        }

        protected void btnNovo_Click(object sender, EventArgs e)
        {
            LimparCampos();
            Habilitar(true);
        }

        protected void btnEditar_Click(object sender, EventArgs e)
        {
            if (status != "" && status == "Agendado")
            {
                Habilitar(true);
            }
            else
            {
                Habilitar(false);
                Mensagem.ExibirEmUP("Agendamentos vencidos não podem ser alterados!");
            }
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            LimparCampos();
            Habilitar(false);
        }

        protected void btnExcluir_Click(object sender, EventArgs e)
        {
            if (agendamentoID != 0)
            {
                try
                {
                    bllAgendamento.Excluir(agendamentoID);
                    Mensagem.ExibirEmUP("Agendamento excluído com sucesso!");
                    LimparCampos();
                    Habilitar(false);
                    PreecherDados();

                }
                catch
                {
                    Mensagem.ExibirEmUP("Não foi possível excluir o agendamento!");
                }
            }
            else
            {
                Mensagem.ExibirEmUP("Selecione um agendamento para excluir!");
            }
        }

        protected void btnSalvar_Click(object sender, EventArgs e)
        {

            if (bllAgendamento.VerificaSeAgendamentoIDExiste(agendamentoID) == false)
            {
                try
                {
                    dtoAgendamento.ClienteID = clienteID;
                    dtoAgendamento.VeiculoID = veiculoID;
                    dtoAgendamento.DataAgendada = calendarAgenda.SelectedDate;
                    dtoAgendamento.Resumo = txtResumo.Text;
                    dtoAgendamento.Descricao = txtDescricao.Text;
                    dtoAgendamento.Status = 0;

                    if (rdListTurno.SelectedValue == "M")
                    {
                        dtoAgendamento.Turno = 0; //Manhã
                    }
                    if (rdListTurno.SelectedValue == "T")
                    {
                        dtoAgendamento.Turno = 1; //Tarde
                    }

                    dataAtual = DateTime.Now.Date;
                    if (bllAgendamento.VerificaAgendamentoRealizado(dataAtual, dtoAgendamento.Turno, clienteID) == false)
                    {
                        TimeSpan timeSpanAgendamento = new TimeSpan();

                        timeSpanAgendamento = calendarAgenda.SelectedDate.Subtract(dataAtual);

                        if (timeSpanAgendamento.TotalSeconds >= 0)
                        {
                            bllAgendamento.Inserir(dtoAgendamento);
                            Mensagem.ExibirEmUP("Horário agendado com sucesso!");
                            LimparCampos();
                            Habilitar(false);
                            PreecherDados();
                        }
                        else
                        {
                            Mensagem.ExibirEmUP("Não é possível efetuar o agendamento com uma data vencida! Informe uma data correta!");
                        }
                    }
                    else
                    {
                        Mensagem.ExibirEmUP("Este cliente já possui um horário agendado neste turno!");
                    }

                }
                catch (Exception)
                {
                    Mensagem.ExibirEmUP("Não foi possível agendar horário!");
                }
            }
            else
            {
                Atualizar();
            }
        }

        private void Atualizar()
        {
            try
            {
                dtoAgendamento.AgendamentoID = agendamentoID;
                dtoAgendamento.ClienteID = clienteID;
                dtoAgendamento.VeiculoID = veiculoID;
                dtoAgendamento.DataAgendada = calendarAgenda.SelectedDate;
                dtoAgendamento.Resumo = txtResumo.Text;
                dtoAgendamento.Descricao = txtDescricao.Text;
                if (rdListTurno.SelectedValue == "M")
                {
                    dtoAgendamento.Turno = 0; //Manhã
                }
                if (rdListTurno.SelectedValue == "T")
                {
                    dtoAgendamento.Turno = 1; //Tarde
                }

                dataAtual = DateTime.Now.Date;

                TimeSpan timeSpanAgendamento = new TimeSpan();

                timeSpanAgendamento = calendarAgenda.SelectedDate.Subtract(dataAtual);

                if (timeSpanAgendamento.TotalSeconds >= 0)
                {
                    bllAgendamento.Atualizar(dtoAgendamento);
                    Mensagem.ExibirEmUP("Horário atualizado com sucesso!");
                    LimparCampos();
                    Habilitar(false);
                    PreecherDados();

                }
                else
                {
                    Mensagem.ExibirEmUP("Não é possível atualizar o agendamento com uma data vencida! Informe uma data correta!");
                }
            }
            catch (Exception)
            {
                Mensagem.ExibirEmUP("Não foi possível atualizar horário!");
            }
        }

        protected void gridSelecioneVeiculo_SelectedIndexChanged(object sender, EventArgs e)
        {
            veiculoID = Convert.ToInt32(gridSelecioneVeiculo.SelectedValue.ToString());
            dtoVeiculo = bllVeiculo.BuscarVeiculoPorVeiculoID(veiculoID);
            txtVeiculo.Text = string.Format("{0} {1}", dtoVeiculo.Marca, dtoVeiculo.Modelo);
        }

        protected void gridAgendamentos_SelectedIndexChanged(object sender, EventArgs e)
        {
            Habilitar(false);
            agendamentoID = Convert.ToInt32(gridAgendamentos.SelectedValue.ToString());
            DataTable agendamentoSelecionado = bllAgendamento.BuscarAgendamentoPorAgendamentoID(agendamentoID);

            status = VerificaStatus((BLLEnumStatus)(int)agendamentoSelecionado.Rows[0]["StatusAtual"]);

            veiculoID = Convert.ToInt32(agendamentoSelecionado.Rows[0]["VeiculoID"]);
            calendarAgenda.SelectedDate = Convert.ToDateTime(agendamentoSelecionado.Rows[0]["DataAgendada"].ToString());
            if ((bool)agendamentoSelecionado.Rows[0]["Turno"])
            {
                rdListTurno.SelectedValue = "T";

            }
            else
            {
                rdListTurno.SelectedValue = "M";
            }
            txtVeiculo.Text = string.Format("{0} {1}", agendamentoSelecionado.Rows[0]["Marca"], agendamentoSelecionado.Rows[0]["Modelo"]);
            txtResumo.Text = agendamentoSelecionado.Rows[0]["Resumo"].ToString();
            txtDescricao.Text = agendamentoSelecionado.Rows[0]["Descricao"].ToString();

        }


    }
}